css: Allow bypassing the compute_value() stage
authorBenjamin Otte <otte@redhat.com>
Sat, 14 Jan 2012 16:04:00 +0000 (17:04 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 2 Feb 2012 02:13:38 +0000 (03:13 +0100)
This is useful when overriding values.

gtk/gtkcsscomputedvalues.c
gtk/gtkcsslookup.c
gtk/gtkcsslookupprivate.h
gtk/gtkstyleproperties.c

index 9a3c1b0f462952fb0366aa2b07b194c316c6e57b..c5b6038cac8bb8009dbb19c5b43c0aa4091d6257 100644 (file)
@@ -187,6 +187,41 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
     }
 }
                                     
+void
+_gtk_css_computed_values_set_value (GtkCssComputedValues *values,
+                                    guint                 id,
+                                    const GValue         *value,
+                                    GtkCssSection        *section)
+{
+  GValue *set;
+
+  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  g_return_if_fail (value == NULL || G_IS_VALUE (value));
+
+  if (values->values == NULL)
+    {
+      values->values = g_array_new (FALSE, TRUE, sizeof (GValue));
+      g_array_set_clear_func (values->values, (GDestroyNotify) g_value_unset);
+    }
+  if (id <= values->values->len)
+   g_array_set_size (values->values, id + 1);
+
+
+  set = &g_array_index (values->values, GValue, id);
+  g_value_init (set, G_VALUE_TYPE (value));
+  g_value_copy (value, set);
+
+  if (section)
+    {
+      if (values->sections == NULL)
+        values->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
+      if (values->sections->len <= id)
+        g_ptr_array_set_size (values->sections, id + 1);
+
+      g_ptr_array_index (values->sections, id) = gtk_css_section_ref (section);
+    }
+}
+
 const GValue *
 _gtk_css_computed_values_get_value (GtkCssComputedValues *values,
                                     guint                 id)
index fce852845ab1c7decae54fab429dc1ecb13d57e4..c3dd7d0a59303751403827f1631af5d9187f9968 100644 (file)
@@ -29,6 +29,7 @@
 typedef struct {
   GtkCssSection     *section;
   const GValue      *value;
+  const GValue      *computed;
 } GtkCssLookupValue;
 
 struct _GtkCssLookup {
@@ -103,6 +104,40 @@ _gtk_css_lookup_set (GtkCssLookup  *lookup,
   lookup->values[id].section = section;
 }
 
+/**
+ * _gtk_css_lookup_set_computed:
+ * @lookup: the lookup
+ * @id: id of the property to set, see _gtk_style_property_get_id()
+ * @section: (allow-none): The @section the value was defined in or %NULL
+ * @value: the "computed value" to use
+ *
+ * Sets the @value for a given @id. No value may have been set for @id
+ * before. See _gtk_css_lookup_is_missing(). This function is used to
+ * set the "winning declaration" of a lookup. Note that for performance
+ * reasons @value and @section are not copied. It is your responsibility
+ * to ensure they are kept alive until _gtk_css_lookup_free() is called.
+ *
+ * As opposed to _gtk_css_lookup_set(), this function forces a computed
+ * value and will not cause computation to happen. In particular, with this
+ * method relative lengths or symbolic colors can not be used. This is
+ * usually only useful for doing overrides. It should not be used for proper
+ * CSS.
+ **/
+void
+_gtk_css_lookup_set_computed (GtkCssLookup  *lookup,
+                              guint          id,
+                              GtkCssSection *section,
+                              const GValue  *value)
+{
+  g_return_if_fail (lookup != NULL);
+  g_return_if_fail (_gtk_bitmask_get (lookup->missing, id));
+  g_return_if_fail (value != NULL);
+
+  _gtk_bitmask_set (lookup->missing, id, FALSE);
+  lookup->values[id].computed = value;
+  lookup->values[id].section = section;
+}
+
 /**
  * _gtk_css_lookup_resolve:
  * @lookup: the lookup
@@ -130,10 +165,16 @@ _gtk_css_lookup_resolve (GtkCssLookup         *lookup,
 
   for (i = 0; i < n; i++)
     {
-      _gtk_css_computed_values_compute_value (values,
-                                              context,
-                                              i,
-                                              lookup->values[i].value,
-                                              lookup->values[i].section);
+      if (lookup->values[i].computed)
+        _gtk_css_computed_values_set_value (values,
+                                            i,
+                                            lookup->values[i].computed,
+                                            lookup->values[i].section);
+      else
+        _gtk_css_computed_values_compute_value (values,
+                                                context,
+                                                i,
+                                                lookup->values[i].value,
+                                                lookup->values[i].section);
     }
 }
index f9669025958fbebc8ad90bc18453b054e1432b4b..d50cb8fd1dc8585b8db6e3ba7181ce1b92fddba0 100644 (file)
@@ -41,6 +41,10 @@ void                    _gtk_css_lookup_set                     (GtkCssLookup
                                                                  guint               id,
                                                                  GtkCssSection      *section,
                                                                  const GValue       *value);
+void                    _gtk_css_lookup_set_computed            (GtkCssLookup       *lookup,
+                                                                 guint               id,
+                                                                 GtkCssSection      *section,
+                                                                 const GValue       *value);
 void                    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
                                                                  GtkStyleContext    *context,
                                                                  GtkCssComputedValues *values);
index ecb79f52d4dbbf516d0d51e3e4b5e9bde909bc9f..a92d72219e99c8cbcec781a48311e88d4926e596 100644 (file)
@@ -339,7 +339,7 @@ gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider,
       if (value == NULL)
         continue;
 
-      _gtk_css_lookup_set (lookup, id, NULL, value);
+      _gtk_css_lookup_set_computed (lookup, id, NULL, value);
     }
 }